package com.lsh.cinfig;

import com.lsh.service.MyUserDetailsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * @author ：LiuShihao
 * @date ：Created in 2020/11/3 10:45 上午
 * @desc ：
 */
// 配置类注解
@Configuration
// 开启 Security 服务
@EnableWebSecurity
//开启全局 Securtiy 注解。
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    /**
     *  注入自定义认证类
     */
    @Autowired
    @Qualifier("userDetailsService")
    private MyUserDetailsServiceImpl userDetailsService;

    /**
     * 如果密码加密，则使用这种方法
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
    }
    /**
     * 定义具体的路径资源对应的权限
     *  authorizeRequests所有security全注解配置实现的开端，表示开始说明需要的权限。
     *  需要的权限分两部分，第一部分是拦截的路径，第二部分访问该路径需要的权限。
     *  antMatchers表示拦截什么路径，permitAll任何权限都可以访问，直接放行所有。
     *  anyRequest()任何的请求，authenticated认证后才能访问
     */

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
                // 如果有允许匿名的url，填在下面
                .antMatchers("/eureka").permitAll()
//                .antMatchers("/dept").permitAll()
                //释放静态资源
                .antMatchers("/js/**","/css/**","/images/*","/fonts/**","/**/*.png","/**/*.jpg").permitAll()
                // 所有请求都需要认证后才能访问
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage("/login")
                .permitAll()
                // 设置登陆成功 的请求路径
                .defaultSuccessUrl("/")
                //设置失败 的请求路径
                .failureUrl("/login")
                .and()
                .logout().permitAll();
                // 关闭CSRF跨域
                http.csrf().disable();
    }
    /**
     * 设置拦截忽略文件夹，可以对静态资源放行  与上边的一样 用那个都可以：
     * @param web
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        // 忽略URL
        web.ignoring().antMatchers("/**/*.js", "/image/*.jepg", "/**/*.css", "/**/*.js", "/**/*.map", "/**/*.html",
                "/**/*.png");
    }




}

